//
// Created by denglibin on 19-10-23.
//

/**
 *在线程实际运行过程中，我们经常需要多个线程保持同步。这时可以用互斥锁来完成任务；互斥锁的使用过程中，
 * 主要有pthread_mutex_init，pthread_mutex_destory，pthread_mutex_lock，pthread_mutex_unlock
 * 这几个函数以完成锁的初始化，锁的销毁，上锁和释放锁操作。
 *
 * 结论：访问共享资源之前加锁，访问结束后解锁，锁的粒度越小越好
 * 死锁1： 单线程在加锁的情况下再次加同一个锁。
 * 死锁2： 多个线程需要多个锁但获取锁的顺序不一致。
 **/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>

static pthread_mutex_t mutex; // 互斥量

static void * t_fun(void * arg){
    pthread_mutex_lock(&mutex); // 加锁
    printf("hello");
    sleep(1);
    printf(" world\n");
   // pthread_mutex_lock(&mutex); // 再次加锁会阻塞 出现死锁
    pthread_mutex_unlock(&mutex); // 释放锁

}

static int main_(void){
    pthread_mutex_init(&mutex, NULL); // 初始化锁
    pthread_t  t;
    pthread_create(&t, NULL, t_fun, NULL);
    t_fun(NULL);
    sleep(2);
    pthread_mutex_destroy(&mutex);
    return 0;
}

